#include "ConfigManager.h"
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

string config_path = "/home/xiayu/Desktop/WN_SHMS/config.json";
// 静态实例初始化
ConfigManager& ConfigManager::getInstance() {
    static ConfigManager instance(config_path);
    return instance;
}

// 构造函数
ConfigManager::ConfigManager(const std::string& configFile)
    : configFile(configFile) {
    loadConfig();
}

ConfigManager::~ConfigManager() {
    // 析构函数实现
}

// 加载配置文件
void ConfigManager::loadConfig() {
    ifstream file(configFile);
    if (file.is_open()) {
        try {
            file >> configData; // 从文件读取 JSON 数据
            cout << "配置加载成功: " << configFile << endl;
        } catch (const exception& e) {
            cerr << "错误：配置文件解析失败: " << e.what() << endl;
            // 如果解析失败，使用默认配置
            configData = {
                {"database_path", "/home/xiayu/Desktop/WN_SHMS/smart_home.db"},
                {"log_level", "info"}
            };
            saveConfig(); // 保存默认配置
        }
        file.close();
        cout << "配置加载成功 : " << configFile << endl;
    } else {
        cerr << "错误：无法打开配置文件: " << configFile << endl;
        // 如果配置文件不存在，创建默认配置
        configData["database_path"] = "/home/xiayu/Desktop/WN_SHMS/smart_home.db"; // 数据库路径
        configData["log_level"] = "info"; // 日志级别
        saveConfig(); // 保存默认配置
    }
}

// 保存配置文件
void ConfigManager::saveConfig() {
    ofstream file(configFile);
    if (file.is_open()) {
        file << configData.dump(4); // 将 JSON 数据格式化保存（缩进为 4 个空格）
        file.close();
        cout << "配置文件保存成功" << endl;
    } else {
        cerr << "错误：无法打开配置文件" << endl;
    }
}

// 更新配置
void ConfigManager::updateConfig(const std::string& key, const std::string& value) {
    configData[key] = value;
    cout << "配置更新成功" << endl;
}

// 获取配置
std::string ConfigManager::getConfig(const std::string& key) const {
    if (configData.contains(key)) { // 检查键是否存在
        return configData[key].get<std::string>(); // 返回字符串值
    } else {
        cerr << "错误:配置key未找到" << endl;
        return "";
    }
}
